package shuaige.jdk.stream.流基础;

import shuaige.jdk.函数式接口.单个操作数并返回相同类型结果UnaryOperator.UnaryOperator具体实现;
import shuaige.jdk.函数式接口.提供结果_Supplier.Supplier_具体实现;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;
import java.util.stream.Stream;

/**
 * 创建流主要是创建Stream对象。每个Stream对象只能使用一次终结操作。
 */
public class 创建流 {

    public static void main(String[] args) {
        基于函数创建无限流();
    }

    public static void 基于数组创建流() {
        // 通过数组生成流
        int[] ints = {1, 2, 3, 4, 5, 6};
        IntStream s1 = Arrays.stream(ints);
        // 直接创建
        Stream s2 = Stream.of("111", "222", "333");
        //
        String[] ss = {"123", "321", "456", "654"};
        Stream<String> s3 = Arrays.stream(ss);
    }

    public static void 通过构建器生成流() {
        Stream<Object> s4 = Stream.builder()
                .add("123")
                .add("321")
                .add("444")
                .add("@21")
                .build();
    }

    public static void 通过集合生成流() {
        List<String> lists = Arrays.asList("123", "321", "1212", "32321");
        Stream<String> s5 = lists.stream();
        Stream<String> s6 = lists.parallelStream();// 并行流
    }

    public static void 创建空流() {
        // 创建空流
        Stream<String> s7 = Stream.empty();
    }

    public static void 基于函数创建无限流() {
        // 创建无限流
        Stream.generate(() -> "number" + Supplier_具体实现.产生一个随机int)
                .limit(5)
                .forEach(System.out::println);

        // 使用种子
        Stream.iterate(1, UnaryOperator具体实现.每次叠加2)
                .limit(5)
                .forEach(System.out::println);
    }

    public void 基本流创建() {
        IntStream intStream = Arrays.stream(new int[]{1, 2, 3});
        LongStream longStream = Arrays.stream(new long[]{1L, 2L, 3L});
        DoubleStream doubleStream = Arrays.stream(new double[]{1D, 2D, 3D});

        // 将Stream<String>转换为LongStream:
        LongStream ls = List.of("1", "2", "3").stream().mapToLong(Long::parseLong);
    }

}
